[this.[myFunc]([this.pokeObj],2,[)]

replace all [...] with indexed placeholders
	the indexes refer to the actual values

multi-pass process  (while [ exists)
	[)]
		[ ... ) detected		=> #xx
			[this.[myFunc]([this.pokeObj],2,#xx)]
	[this.pokeObj]
		this.pokeObj	=> #01					= [Object object]
			[this.[myFunc](#01,2,#xx)]
	[myFunc]
		myFunc				=> #03
			[this.#03(#01,2,#xx)]
	[this.#03(#01,2,#xx)]
		[ ... (
		[this.#03(
			#003 is string
				this.#03		=> this.addPokemon
			#003 is number
				this.#03		=> this.0
			#003 is boolean
				this.#03		=> this.false
			#003 is Object  (anything else)
				this.#03		=> invalid		=>	erase bad code
					[this.#03(#01,2,#xx)]	=> "ERROR"
						(replace the function-path and all of its parameters with the literal word "ERROR" and remove the surrounding [] so this is not re-evaluated)
			if no error, resolve  [this.addPokemon(
				this.addPokemon => [function ref]
			build param array
				(#01,2,#xx)		=>		[ #01, 2, #xx ]		(actual array, not a string)
					resolve each parameter
						[ obj, 2, "[" ]
							call the function with these parameters, and store the result
							[this.#03(#01,2,#xx)]		=>  #004

After multi-pass, resolve any remaining #
	If there's surrounding text, then return the result as a concatenated string
		this.#004		=>		this.[Object object]
	If there is only one value, return its actual form
		#004				=>		[ref]

Both the final step, and the function resolver use the same code
